package iso8583

import (
	"fmt"
)

//Message 报文结构
type Message struct {
	Head            Header
	MessageTypeCode MessageTypeID
	Bit             BitMap
	Fields          map[int]Fielder
	kidF61          KidField61
}

//MessageTypeID 报文类型识别码
type MessageTypeID struct {
	Data    []byte
	Len     int
	DataStr string
}

//NewMessageTypeID 报文类型识别码
func NewMessageTypeID() *MessageTypeID {
	m := &MessageTypeID{
		Len: 4,
	}
	return m
}

//Do 解析报文识别码
func (tcode *MessageTypeID) Do(b []byte, p *Position) {
	data := make([]byte, tcode.Len)
	copy(data, b[p.Get():p.Get()+tcode.Len])
	p.Add(tcode.Len)
	tcode.Data = data
	tcode.DataStr = tcode.DataString()
	fmt.Printf("解析报文识别码%+v", tcode)
}

//DataString 输出数据
func (tcode *MessageTypeID) DataString() string {
	return string(tcode.Data)
}

func (tcode *MessageTypeID) String() string {
	str := fmt.Sprintf("{\n	Data:%s\n	Len:%d\n}", tcode.DataString(), tcode.Len)
	return str
}

//NewMessage 创建消息
func NewMessage() *Message {
	m := new(Message)
	m.Fields = make(map[int]Fielder)
	return m
}

//Do 解析组装银联发送来的数据
func (m *Message) Do(b []byte) {

	//初始位置
	p := NewPosion()
	//头部数据
	header := NewHeader()
	header.Do(b, p)
	m.Head = *header
	//报文识别码
	mTID := NewMessageTypeID()
	mTID.Do(b, p)
	m.MessageTypeCode = *mTID
	//位图
	bm := NewBitMap()
	bm.Do(b, p)
	m.Bit = *bm
	//开始解析域
	bits := m.Bit.Bits

	for i := 0; i < len(bits); i++ {
		index := bits[i]
		if f, ok := Fd[index]; ok {
			f.Parse(b, p)
			m.Fields[index] = f
		}
	}

}
